package jmine.tec.rpc.common.metadata;

import jmine.tec.rpc.RPCMessages;
import jmine.tec.rpc.common.RPCException;
import jmine.tec.rpc.common.annotation.RestDefinition;

/**
 * Provê metadados de um rest implementor
 * 
 * @author lundberg
 */
public final class RestServiceMetadata {

    /**
     * Construtor
     */
    private RestServiceMetadata() {
        // OK
    }

    /**
     * Verifica se a classe corresponde a um serviço (é uma interface e possui os metadados adequados)
     * 
     * @param service service
     */
    public static void verifyService(Class<?> service) {
        if (service == null) {
            throw new RPCException(RPCMessages.NULL_SERVICE_CLASS.create());
        }
        if (!service.isAnnotationPresent(RestDefinition.class)) {
            throw new RPCException(RPCMessages.SERVICE_ANNOTATION_NOT_FOUND.create(service.getSimpleName()));
        }
        if (!service.isInterface()) {
            throw new RPCException(RPCMessages.SERVICE_MUST_BE_AN_INTERFACE.create(service.getSimpleName()));
        }
    }

    /**
     * Verifica a classe dada corresponde a uma interface de serviço
     * 
     * @param aClass classe a ser verificada
     * @return boolean
     */
    public static boolean isService(Class<?> aClass) {
        return aClass.isInterface() && aClass.isAnnotationPresent(RestDefinition.class);
    }
}
